package com.team.game.framework.impl;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class DataBase extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String KEY_ID = "id";

    private static final String MAG_TABLE_NAME = "MAG_UPGRADE";
    private static final String[] MAG_NAMES = {"Fire", "Earth", "Wood", "Sand", "Necromancer", "Water", "Light", "Ice"};


    private static final String MAG_NAME = "NAME";
    private static final String LOCATION_NAME = "NAME";
    private static final String[] Number = {"Num1", "Num2", "Num3", "Num4", "Num5", "Num6", "Num7", "Num8"};

    private static final String UNLOCK = "UNLOCK";

    private static final String GOLD_TABLE_NAME = "GOLD";
    private static final String MAP_TABLE_NAME = "MAP";
    private static final String SCROLL_TABLE_NAME = "SCROLL";

    private static final String LEVEL = "LEVEL";

    private static final String[] LOCATION_NAMES = {"Forest", "Crystal", "Jungle", "Swamp", "Mountains", "Antarctida", "Mushroums", "Atlantida","Dead", "Sand","Vulcans"};
    private static final String LOCATION = "LOCATION";
    private static final String isCOMPLETED = "COMPLETED";
    private static final String COMPLETED_LEVEL = "COMPLETED_LEVEL";
    private static final String[] BONUS_LEVEL = {"LEVEL1","LEVEL2","LEVEL3"};

    private SQLiteDatabase sqLiteDatabase;


    DataBase(Context context) {
        super(context, "myDB", null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        this.sqLiteDatabase = sqLiteDatabase;
        //уровень
        sqLiteDatabase.execSQL("create table " + LEVEL + " (" + KEY_ID + " integer primary key autoincrement, "
                + LOCATION + " TEXT, "
                + LEVEL + " INTEGER NOT NULL DEFAULT 0" + ");");

        //голда
        sqLiteDatabase.execSQL("create table " + GOLD_TABLE_NAME + " (" + KEY_ID + " integer primary key autoincrement, "
                + GOLD_TABLE_NAME + " INTEGER NOT NULL DEFAULT 1000" + ");");

        //свитки
        sqLiteDatabase.execSQL("create table " + SCROLL_TABLE_NAME + " (" + KEY_ID + " integer primary key autoincrement, "
                + SCROLL_TABLE_NAME + " INTEGER NOT NULL DEFAULT 10" + ");");
        //карта
        sqLiteDatabase.execSQL("create table "
                        + MAP_TABLE_NAME
                        + " ("
                        + KEY_ID + " integer primary key autoincrement, "
                        + LOCATION_NAME + " TEXT, "
                        + isCOMPLETED + " BOOLEAN NOT NULL DEFAULT 0, "
                        + COMPLETED_LEVEL + " INTEGER NOT NULL DEFAULT 0, "
                        + "LEVEL1 INTEGER NOT NULL DEFAULT 0, "
                        + "LEVEL2 INTEGER NOT NULL DEFAULT 0, "
                        + "LEVEL3 INTEGER NOT NULL DEFAULT 0 "
                        + ");");


        //для магов
        sqLiteDatabase.execSQL("create table "
                + MAG_TABLE_NAME
                + " ("
                + KEY_ID + " integer primary key autoincrement, "
                + MAG_NAME + " TEXT, "
                + UNLOCK + " INTEGER NOT NULL DEFAULT 0, "
                + "Num1 INTEGER NOT NULL DEFAULT 0, "
                + "Num2 INTEGER NOT NULL DEFAULT 0, "
                + "Num3 INTEGER NOT NULL DEFAULT 0, "
                + "Num4 INTEGER NOT NULL DEFAULT 0, "
                + "Num5 INTEGER NOT NULL DEFAULT 0, "
                + "Num6 INTEGER NOT NULL DEFAULT 0, "
                + "Num7 INTEGER NOT NULL DEFAULT 0, "
                + "Num8 INTEGER NOT NULL DEFAULT 0"
                + ");");


        setStartConfiguration(sqLiteDatabase);

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    private void setStartConfiguration(SQLiteDatabase sqLiteDatabase) {
        // создаем объект для данных
        ContentValues cv = new ContentValues();
        cv.put(LOCATION_NAME, LOCATION_NAMES[0]);
        cv.put(isCOMPLETED, 1);
        sqLiteDatabase.insert (MAP_TABLE_NAME, null, cv);
        cv.clear();

        for (int i = 1; i < 11; i++) {
            cv.put(LOCATION_NAME, LOCATION_NAMES[i]);
            sqLiteDatabase.insert (MAP_TABLE_NAME, null, cv);
            cv.clear();
        }

        cv.put(MAG_NAME, MAG_NAMES[0]);
        cv.put(UNLOCK, 1);
        sqLiteDatabase.insert(MAG_TABLE_NAME, null, cv);
        cv.clear();

        for (int i = 1; i < 8; i++) {
            cv.put(MAG_NAME, MAG_NAMES[i]);
            sqLiteDatabase.insert(MAG_TABLE_NAME, null, cv);
            cv.clear();
        }

        cv.put(GOLD_TABLE_NAME, 1000);
        sqLiteDatabase.insert (GOLD_TABLE_NAME, null, cv);
        cv.clear ();

        cv.put(SCROLL_TABLE_NAME, 10);
        sqLiteDatabase.insert (SCROLL_TABLE_NAME, null, cv);
        cv.clear ();
    }

    public int getCurrentGold(){

        sqLiteDatabase = this.getReadableDatabase();

        // делаем запрос всех данных из таблицы mytable, получаем Cursor
        Cursor c = sqLiteDatabase.query(GOLD_TABLE_NAME, null, null, null, null, null, null);
        c.moveToFirst();
        int gold = c.getInt (c.getColumnIndex (GOLD_TABLE_NAME));
        c.close ();
        sqLiteDatabase.close ();
        return gold;
    }

    public void updateGold(int gold){

        sqLiteDatabase = this.getWritableDatabase();

        ContentValues cv = new ContentValues ();
        cv.put(GOLD_TABLE_NAME, gold);

        sqLiteDatabase.update (GOLD_TABLE_NAME, cv, "id = ?", new String[]{"1"});

        sqLiteDatabase.close ();

    }
    public int getCurrentScroll(){

        sqLiteDatabase = this.getReadableDatabase();

        // делаем запрос всех данных из таблицы mytable, получаем Cursor
        Cursor c = sqLiteDatabase.query(SCROLL_TABLE_NAME, null, null, null, null, null, null);
        c.moveToFirst();
        int Scroll = c.getInt (c.getColumnIndex (SCROLL_TABLE_NAME));
        c.close ();
        sqLiteDatabase.close ();
        return Scroll;
    }

    public void updateScroll(int Scroll){

        sqLiteDatabase = this.getWritableDatabase();

        ContentValues cv = new ContentValues ();
        cv.put(GOLD_TABLE_NAME, Scroll);

        sqLiteDatabase.update (SCROLL_TABLE_NAME, cv, "id = ?", new String[]{"1"});

        sqLiteDatabase.close ();

    }




    public void setUnlock(int NumMag){

        sqLiteDatabase = this.getWritableDatabase();

        ContentValues cv = new ContentValues ();
        cv.put(UNLOCK,1);

        sqLiteDatabase.update (MAG_TABLE_NAME, cv, MAG_NAME+" = ?", new String[]{MAG_NAMES[NumMag]});

        sqLiteDatabase.close ();

    }

    public int getUnlockLocation() {

        sqLiteDatabase = this.getReadableDatabase();
        // делаем запрос всех данных из таблицы mytable, получаем Cursor
        Cursor c = sqLiteDatabase.query(MAP_TABLE_NAME, null, null, null, null, null, null);


        int unlockLocation = 0;
        // ставим позицию курсора на первую строку выборки
        // если в выборке нет строк, вернется false
        if (c.moveToFirst()) {
            int locationColumn = c.getColumnIndex(isCOMPLETED);
            // определяем номера столбцов по имени в выборке
            do {
                int a = c.getInt (locationColumn);
                if (c.getInt (locationColumn) != 0) {
                    unlockLocation++;
                }
                // а если следующей нет (текущая - последняя), то false - выходим из цикла
            } while (c.moveToNext());
        }
        sqLiteDatabase.close();
        c.close ();
        return unlockLocation;
    }

    public void getUnlockLocationBonusLevel(boolean[] Locaion, int numberLocation) {

        sqLiteDatabase = this.getReadableDatabase();
        // делаем запрос всех данных из таблицы mytable, получаем Cursor
        Cursor c = sqLiteDatabase.query(MAP_TABLE_NAME, null, null, null, null, null, null);


        int[] locationColumn = new int[3];
        for(int i = 0 ; i < 3 ; i ++)
        {
            locationColumn[i] = c.getColumnIndex(BONUS_LEVEL[i]);
            Locaion[i] = Boolean.valueOf(""+c.getInt(locationColumn[i]));
        }

        sqLiteDatabase.close();
        c.close ();
    }

    public int getUnlockLocationLevel(int numberLocation) {

        sqLiteDatabase = this.getReadableDatabase();
        // делаем запрос всех данных из таблицы mytable, получаем Cursor
        Cursor c = sqLiteDatabase.query(MAP_TABLE_NAME, null, null, null, null, null, null);

        c.moveToPosition(numberLocation+1);
        int locationColumn = c.getColumnIndex(COMPLETED_LEVEL);
        // определяем номера столбцов по имени в выборке
        int completedLocation = c.getInt(locationColumn);
        sqLiteDatabase.close();
        c.close ();
        return completedLocation;
    }

    public void getMagInfo(int[][] MagMas) {

        sqLiteDatabase = this.getReadableDatabase();
        int[] MagMasInfo = new int[9];
        // делаем запрос всех данных из таблицы mytable, получаем Cursor
        Cursor c = sqLiteDatabase.query(MAG_TABLE_NAME, null, null, null, null, null, null);

        // ставим позицию курсора на первую строку выборки
        // если в выборке нет строк, вернется false
        if (c.moveToFirst()) {
            // определяем номера столбцов по имени в выборке

            MagMasInfo[0] = c.getColumnIndex(UNLOCK);
            for (int i = 1; i < 9; i++)
            {
                MagMasInfo[i] = c.getColumnIndex(Number[i - 1]);
            }
            int i = 0;
            do {
                for(int  j = 0; j < 9; j++) {
                    MagMas[i][j] = c.getInt(MagMasInfo[j]);
                }
//                Log.i("значения",
//                        "имя мага "+ c.getString(Name)+
//                                " Текуший маг = " + i +
//                                ", Unlock = " +  MagMas[i][0] +
//                                ", первый скил = " +   MagMas[i][1]+
//                                ", последний с скил = " +  MagMas[i][8]);
                // а если следующей нет (текущая - последняя), то false - выходим из цикла
                i++;
            } while (c.moveToNext());
        }
        sqLiteDatabase.close();
        c.close ();
    }

    public void updateMagSkills (int[][] mags) {

        sqLiteDatabase = this.getWritableDatabase ();

        ContentValues cv = new ContentValues ();

        for (int i = 0; i < 8; i++) {
            for (int j = 1; j < 9; j++) {
                cv.put (Number[j-1], mags[i][j]);
            }
            sqLiteDatabase.update (MAG_TABLE_NAME, cv, "id = ?", new String[]{String.valueOf (i + 1)});
            cv.clear ();
        }

        sqLiteDatabase.close ();
    }

//    public void updateMagSkill(int NumMag, int NumSkill, int LevelSkill){
//
//        sqLiteDatabase = this.getWritableDatabase();
//
//        ContentValues cv = new ContentValues ();
//        cv.put(Number[NumSkill],LevelSkill);
//
//        sqLiteDatabase.update (MAG_TABLE_NAME, cv, MAG_NAME+" = ?", new String[]{MAG_NAMES[NumMag]});
//
//        sqLiteDatabase.close ();
//
//    }
}